package singleton;

public class Singleton {

    /**
     * 私有构造器，避免被其他的类实例化
     */
    private Singleton() {
    }

    // 延迟实例化
//    private static Singleton uniqueInstance;

    // 急切实例化
//    private static Singleton uniqueInstance = new Singleton();

    // 双重检查加锁
    private volatile static Singleton uniqueInstance;

    private int num;

    /**
     * 同步 getInstance() 方法
     * 实现简单，但性能差
     */
//    public static synchronized Singleton getInstance() {
//        if (uniqueInstance == null) {
//            uniqueInstance = new Singleton();
//        }
//        return uniqueInstance;
//    }

    /**
     * 急切实例化
     * 在加载类时，直接实例化一个对象
     * 如果该单件对象不一定使用的话，单件对象会造成资源浪费，因为不管是否使用该对象，它都会被创建
     */
//    public static Singleton getInstance() {
//        return uniqueInstance;
//    }

    /**
     * 双重检查加锁
     * 只在第一次创建对象时加锁，既保证了性能，又实现了延迟实例化
     */
    public static Singleton getInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }

    public void add(int n) {
        num += n;
    }

    public int value() {
        return num;
    }

}
